/**************************************************************************
	File		: matrixLed.c
	Author		: 
	Date		: 2020-4-6
***************************************************************************/
	
/**************************************************************************
    								include
***************************************************************************/
#include "commonDef.h"
#include "cmsis_os.h"
#include "matrixLed.h"	
/**************************************************************************
    								macro
***************************************************************************/
	
/**************************************************************************
    								typedef
***************************************************************************/
typedef struct tagMatrixLedGpio_t
{
	GPIO_TypeDef *pBank;
	uint16_t pin;
}MatrixLedGpio_t;

typedef struct tagLedGpio_t
{
	GPIO_TypeDef *pBank;
	uint16_t pin;
}LedGpio_t;
/**************************************************************************
    								variables
***************************************************************************/
/* led - */
const MatrixLedGpio_t g_MatrixLedRow[] = {
	{ GPIOB, GPIO_PIN_15 },
	{ GPIOD, GPIO_PIN_8 },
	{ GPIOD, GPIO_PIN_9 },
	{ GPIOD, GPIO_PIN_10 },
	{ GPIOD, GPIO_PIN_11 },
	{ GPIOD, GPIO_PIN_12 },
	{ GPIOD, GPIO_PIN_13 },
	{ GPIOD, GPIO_PIN_14 },
	{ GPIOD, GPIO_PIN_15 }
};

/* led + */
const MatrixLedGpio_t g_MatrixLedColumnl[] = {
	{ GPIOB, GPIO_PIN_12 },
	{ GPIOB, GPIO_PIN_13 },
	{ GPIOB, GPIO_PIN_14 }
};

/* led */
const LedGpio_t g_LedGpios[] = {
	{ GPIOC, GPIO_PIN_14 },	/* 0 */
	{ GPIOE, GPIO_PIN_5 },	/* 1 */
	{ GPIOC, GPIO_PIN_15 },	/* 2 */
	{ GPIOE, GPIO_PIN_4 },	/* 3 */
	{ GPIOC, GPIO_PIN_13 },	/* 4 */
	{ GPIOE, GPIO_PIN_3 },	/* 5 */
	{ GPIOE, GPIO_PIN_3 },	/* 6 dummy */
	{ GPIOE, GPIO_PIN_2 },	/* 7 */
	{ GPIOE, GPIO_PIN_6 },	/* 8 */
	{ GPIOE, GPIO_PIN_1 },	/* 9 */
};

uint8_t g_MatrixLed[27] = {1, 1, 1, 0};
uint8_t g_Led[10] = {1, 1, 1, 0, 0};
/**************************************************************************
    								functions
***************************************************************************/
void MatrixLedScan(void)
{
	int i = 0;

	for (i = 0; i < DIM(g_Led); i++)
	{
		HAL_GPIO_WritePin(g_LedGpios[i].pBank, g_LedGpios[i].pin, (GPIO_PinState)g_Led[i]);
	}
	
	for (i = 0; i < DIM(g_MatrixLedColumnl); i++)
	{
		int j = 0;

		for (j = 0; j < DIM(g_MatrixLedColumnl); j++)
		{
			HAL_GPIO_WritePin(g_MatrixLedColumnl[j].pBank, g_MatrixLedColumnl[j].pin, GPIO_PIN_SET);
		}
		
		
		for (j = 0; j < DIM(g_MatrixLedRow); j++)
		{
			HAL_GPIO_WritePin(g_MatrixLedRow[j].pBank, g_MatrixLedRow[j].pin, (GPIO_PinState)g_MatrixLed[i*DIM(g_MatrixLedRow)+j]);
		}
		
		for (j = 0; j < DIM(g_MatrixLedColumnl); j++)
		{
			if (i != j)
			{
				HAL_GPIO_WritePin(g_MatrixLedColumnl[j].pBank, g_MatrixLedColumnl[j].pin, GPIO_PIN_SET);
			}
			else
			{
				HAL_GPIO_WritePin(g_MatrixLedColumnl[j].pBank, g_MatrixLedColumnl[j].pin, GPIO_PIN_RESET);
			}
			
		}
		
		osDelay(2);
	}
}

void MatrixLedSet(uint8_t index, uint8_t value)
{
	g_MatrixLed[index] = value;
}

void MatrixLedSetAll(uint8_t value)
{
	int i = 0;
	
	for (i = 0; i < DIM(g_MatrixLed); i++)
	{
		MatrixLedSet(i, value);
	}
}

void LedSet(uint8_t index, uint8_t value)
{
	g_Led[index] = value;
}

void LedSetAll(uint8_t value)
{
	int i = 0;
	
	for (i = 0; i < DIM(g_Led); i++)
	{
		LedSet(i, value);
	}
}

